package jdbc.tx;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TransactionTest {
	public static void main(String[] args) throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		TransactionTest tx = new TransactionTest();
		tx.insertThreeDept();
		System.out.println("등록완료");
	}
	
	//jdbc는 기본적으로 auto-commit
	public void insertThreeDept() throws SQLException{
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		
		
		String sql1 = "insert into department values('a1','ab','ac')";
		String sql2 = "insert into department values('b','b','b')";
		String sql3 = "insert into department values('c','c','c')";
		
		Connection conn = null;
		Statement stmt = null;
		
		try{
			conn = DriverManager.getConnection(url,"scott","tiger");
			stmt = conn.createStatement();
			
			
			conn.setAutoCommit(false);//Transaction start
			
			stmt.executeUpdate(sql1);
			stmt.executeUpdate(sql2);//만약 여기서 에러가 발생하면 이 에러는 Catch문이 잡게 되고 
			stmt.executeUpdate(sql3);//캐취 문이 실행되면서 롤백이 실행된다.
			//만약 sql문이 전부 다 잘 실행 되었다면 밑에 커밋이 순차적으로 실행되면서 정상처리 된다.
			conn.commit();//Transaction 정상 종료 의미 (전송한 sql문이 최종 처리됨)
			
		
		}catch(SQLException e){
			conn.rollback();//Transaction 비정상 종료(TX시작 시점의 상태로 원상복귀)
			//롤백은 캐취에서 실행한다.
			throw e;//얘는 근데 왜 쓰는거지? 	
			//e.printStackTrace();
		}finally{
			if(stmt != null) stmt.close();
			if(conn != null) conn.close();
		}
	}
}
